package com.powernode.driver.controller;

import com.powernode.common.annotation.PowerLogin;
import com.powernode.common.result.Result;
import com.powernode.common.util.AuthContextHolder;
import com.powernode.driver.service.OrderService;
import com.powernode.model.form.map.CalculateDrivingLineForm;
import com.powernode.model.form.order.OrderFeeForm;
import com.powernode.model.form.order.StartDriveForm;
import com.powernode.model.form.order.UpdateOrderCartForm;
import com.powernode.model.vo.map.DrivingLineVo;
import com.powernode.model.vo.order.CurrentOrderInfoVo;
import com.powernode.model.vo.order.NewOrderDataVo;
import com.powernode.model.vo.order.OrderInfoVo;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import jakarta.annotation.Resource;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.*;

import java.util.List;

/**
 * 司机端订单控制器
 * 处理司机相关的订单操作请求，包括订单状态查询、新订单队列查询、当前订单查询及抢单功能
 */
@Slf4j  // Lombok注解：提供日志记录功能
@Tag(name = "订单API接口管理")  // Swagger注解：标记接口文档分组名称
@RestController  // Spring注解：标识为REST控制器，响应JSON格式数据
@RequestMapping("/order")  // 基础请求路径：所有接口的URL前缀
@SuppressWarnings({"unchecked", "rawtypes"})  // 抑制未检查类型转换和原始类型警告
public class OrderController {
    @Resource  // 依赖注入：自动装配订单服务接口实例
    private OrderService orderService;  // 订单业务逻辑层对象

    /**
     * 查询订单状态接口
     * @param orderId 订单ID（路径参数）
     * @return 统一响应结果，data为订单状态码
     */
    @Operation(summary = "查询订单状态")  // Swagger注解：接口功能描述
    @GetMapping("/getOrderStatus/{orderId}")  // HTTP GET请求，接口路径：/order/getOrderStatus/{orderId}
    public Result<Integer> getOrderStatus(@PathVariable Long orderId) {  // @PathVariable：接收URL路径中的订单ID
        // 调用服务层查询订单状态，包装为统一响应格式返回
        return Result.ok(orderService.queryOrderStatus(orderId));
    }

    /**
     * 查询配送员新订单队列数据接口
     * 获取司机待处理的新订单列表（需登录）
     * @return 统一响应结果，data为新订单数据列表
     */
    @Operation(summary = "查询配送员新队列订单数据")  // Swagger注解：接口功能描述
    @PowerLogin  // 自定义注解：验证司机是否已登录（未登录则拦截请求）
    @GetMapping("/findNewOrderQueueData")  // HTTP GET请求，接口路径：/order/findNewOrderQueueData
    public Result<List<NewOrderDataVo>> findNewOrderQueueData() {
        // 从上下文获取当前登录司机ID（通过AuthContextHolder工具类）
        Long driverId = AuthContextHolder.getUserId();
        // 调用服务层查询司机的新订单队列，包装为统一响应格式返回
        return Result.ok(orderService.findNewOrderQueueData(driverId));
    }

    /**
     * 查找配送员当前订单接口
     * 查询司机正在处理的活跃订单（需登录）
     * @return 统一响应结果，data为当前订单信息VO
     */
    @Operation(summary = "查找配送员当前订单")  // Swagger注解：接口功能描述
    @PowerLogin  // 自定义注解：验证司机登录状态
    @GetMapping("/searchDriverCurrentOrder")  // HTTP GET请求，接口路径：/order/searchDriverCurrentOrder
    public Result<CurrentOrderInfoVo> searchDriverCurrentOrder() {
        // 获取当前登录司机ID
        Long driverId = AuthContextHolder.getUserId();
        // 调用服务层查询司机当前活跃订单，包装为统一响应格式返回
        return Result.ok(orderService.searchDriverCurrentOrder(driverId));
    }

    /**
     * 抢单接口
     * 司机抢接指定订单（需登录且订单未被抢）
     * @param orderId 待抢订单ID（路径参数）
     * @return 统一响应结果，data为抢单是否成功的布尔值
     */
    @Operation(summary = "抢单")  // Swagger注解：接口功能描述
    @PowerLogin  // 自定义注解：验证司机登录状态
    @GetMapping("/robNewOrder/{orderId}")  // HTTP GET请求，接口路径：/order/robNewOrder/{orderId}
    public Result<Boolean> robNewOrder(@PathVariable Long orderId) {  // @PathVariable：接收URL路径中的订单ID
        // 获取当前登录司机ID
        Long driverId = AuthContextHolder.getUserId();
        // 调用服务层执行抢单逻辑，包装为统一响应格式返回
        return Result.ok(orderService.robNewOrder(driverId, orderId));
    }

    /**
     * 获取订单账单详细信息接口
     * 查询指定订单的详细账单信息（需登录且订单存在）
     *
     * @param orderId 订单ID（路径参数）
     * @return 统一响应结果，data为订单账单详细信息VO
     */
    @Operation(summary = "获取订单账单详细信息")
    @PowerLogin
    @GetMapping("/getOrderInfo/{orderId}")
    public Result<OrderInfoVo> getOrderInfo(@PathVariable Long orderId) {
        // 获取当前登录配送员ID
        Long driverId = AuthContextHolder.getUserId();
        return Result.ok(orderService.getOrderInfo(orderId, driverId));
    }

    /**
     * 计算最佳驾驶线路接口
     * 计算从当前位置到订单目的地的最佳驾驶线路（需登录）
     *
     * @param calculateDrivingLineForm 包含订单ID和当前位置的表单数据（请求体）
     * @return 统一响应结果，data为最佳驾驶线路VO
     */
    @Operation(summary = "计算最佳驾驶线路")
    @PowerLogin
    @PostMapping("/calculateDrivingLine")
    public Result<DrivingLineVo> calculateDrivingLine(@RequestBody CalculateDrivingLineForm calculateDrivingLineForm) {
        return Result.ok(orderService.calculateDrivingLine(calculateDrivingLineForm));
    }

    /**
     * 配送员到达配送起始地点接口
     * 配送员到达订单起始地点后，更新订单状态（需登录）
     *
     * @param orderId 订单ID（路径参数）
     * @return 统一响应结果，data为到达起始地点是否成功的布尔值
     */
    @Operation(summary = "配送员到达配送起始地点")
    @PowerLogin
    @GetMapping("/driverArriveStartLocation/{orderId}")
    public Result<Boolean> driverArriveStartLocation(@PathVariable Long orderId) {
        Long driverId = AuthContextHolder.getUserId();
        return Result.ok(orderService.driverArriveStartLocation(orderId, driverId));
    }

    /**
     * 更新配送车辆信息接口
     * 配送员更新订单配送车辆信息（需登录）
     *
     * @param updateOrderCartForm 包含订单ID和配送车辆信息的表单数据（请求体）
     * @return 统一响应结果，data为更新配送车辆信息是否成功的布尔值
     */
    @Operation(summary = "更新配送车辆信息")
    @PowerLogin
    @PostMapping("/updateOrderCart")
    public Result<Boolean> updateOrderCart(@RequestBody UpdateOrderCartForm updateOrderCartForm) {
        // 获取当前登录配送员ID
        Long driverId = AuthContextHolder.getUserId();
        // 设置配送车辆信息表单中的配送员ID
        updateOrderCartForm.setDriverId(driverId);
        return Result.ok(orderService.updateOrderCart(updateOrderCartForm));
    }

    /**
     * 配送员开始配送服务接口
     * 配送员开始配送订单服务（需登录）
     *
     * @param startDriveForm 包含订单ID的表单数据（请求体）
     * @return 统一响应结果，data为开始配送服务是否成功的布尔值
     */
    @Operation(summary = "开始配送服务")
    @PowerLogin
    @PostMapping("/startDrive")
    public Result<Boolean> startDrive(@RequestBody StartDriveForm startDriveForm) {
        startDriveForm.setDriverId(AuthContextHolder.getUserId());
        return Result.ok(orderService.startDrive(startDriveForm));
    }

    /**
     * 配送员结束配送服务更新订单账单接口
     * 配送员完成订单配送服务，更新订单账单信息（需登录）
     *
     * @param orderFeeForm 包含订单ID和配送服务费用的表单数据（请求体）
     * @return 统一响应结果，data为更新订单账单是否成功的布尔值
     */
    @Operation(summary = "结束配送服务更新订单账单")
    @PowerLogin
    @PostMapping("/endDrive")
    public Result<Boolean> endDrive(@RequestBody OrderFeeForm orderFeeForm) {
        Long driverId = AuthContextHolder.getUserId();
        orderFeeForm.setDriverId(driverId);
        return Result.ok(orderService.endDrive(orderFeeForm));
    }
}

